#pragma once

#include <rtc_base/logging.h>
#include <fstream>
#include <queue>
#include <mutex>
#include <thread>

namespace xrtc {

class XrtcLog : public rtc::LogSink {
public:
    XrtcLog(const std::string& log_dir, const std::string& log_name, const std::string& log_level) 
                : m_log_dir(log_dir), m_log_name(log_name), m_log_level(log_level)
                , m_log_file_path(log_dir + "/" + log_name + ".log")
                , m_log_file_wf(log_dir + "/" + log_name + ".log.wf") {

                }

    ~XrtcLog() {
        stop();

        // 关闭文件流
        m_out_file.close();
        m_out_file_wf.close();
    }

    // 初始化输出的日志
    int init();

    // 启动日志写入线程
    bool start();
    // 停止日志写入线程
    void stop();
    // 等待日志写入线程结束
    void join();

    // 写入日志线程函数
    void logThreadFunction();

    // 设置是否在控制台输出日志
    void set_log_to_stderr(bool on);

    void OnLogMessage(const std::string& message,
                            rtc::LoggingSeverity severity) override;

    // 无实际意义无需实现                            
    void OnLogMessage(const std::string& message) override;

private:
    std::string m_log_dir;          // 日志存放目录
    std::string m_log_name;         // 日志文件名
    std::string m_log_level;        // 日志级别
    std::string m_log_file_path;    // 日志文件绝对路径
    std::string m_log_file_wf;    // 警告日志文件

    std::ofstream m_out_file;        // 输出日志文件流
    std::ofstream m_out_file_wf;    // 输出警告日志文件流   

    std::queue<std::string> m_log_queue;  // 日志队列
    std::mutex m_log_mutex;              // 日志队列互斥锁

    std::queue<std::string> m_log_queue_wf;  // 错误日志队列
    std::mutex m_log_mutex_wf;              // 错误日志队列互斥锁   

    std::unique_ptr<std::thread> m_log_thread;    // 日志写入线程
    std::atomic<bool> m_running{false};  // 日志写入线程运行状态

};

} // namespace xrtc